package com.li.utlis;

import com.li.domain.UploadFile;
import com.li.service.UploadFileService;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * 文件上传工具类
 */
public class FileUploadUtil {

    //以时间作为文件夹
    static SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");

    //文件存放的路径
    public static String fileSavePath="E:/cell_system/";

    /**
     * 上传文件到指定路径中，
     * 例如 fileSavePath=E:/uploadFile/"
     * @param uploadFile uploadPahtFile
     * @param fileSavePath 指定的路径
     * @param req   request
     * @return 返回通过项目访问文件的路径（需要配置资源映射）
     */
    public static String uploadPahtFile(MultipartFile uploadFile,String fileSavePath, HttpServletRequest req) {
        if ("".equals(uploadFile.getOriginalFilename())){
            return "";
        }
        //项目访问的路径
        String filePath = "";
        String format = sdf.format(new Date());
        //固定物理路径
        File folder = new File(fileSavePath + format);
        //如果文件夹不存在则创建
        if (!folder.isDirectory()) {
            folder.mkdirs();//创建文件夹
        }
        //上传的文件名
        String oldName = uploadFile.getOriginalFilename();
        //新的文件名
        String newName = UUID.randomUUID().toString() +
                oldName.substring(oldName.lastIndexOf("."), oldName.length());
        try {
            //将uploadFile存到一个路径为：folder，名字为：newName的文件，
            uploadFile.transferTo(new File(folder, newName));
            //去掉盘符的相对路径
            String path=fileSavePath.split(":")[1];
            //获取项目访问的路径
            filePath = req.getScheme() + "://" + req.getServerName() + ":" +
                    req.getServerPort() + path + format + newName;
        } catch (IOException e) {
            e.printStackTrace();
            return "上传失败! ";
        }
        return filePath;
    }

    /**
     * 上传文件到服务器路径，
     * 当上传过后项目再一次启动则会改变之前的路径，
     * 之前的文件也无法访问到了，但是还存在再电脑的临时文件夹 Temp 中
     * @param uploadFile 上传的文件
     * @param req request
     * @return 返回通过项目访问文件的路径（不需要配置资源映射）
     */
    public static String uploadServerFile(MultipartFile uploadFile, HttpServletRequest req) {
        if ("".equals(uploadFile.getOriginalFilename())){
            return "";
        }
        //文件存在的物理路径，但会随着项目的重新启动而改变
        String realPath =
                req.getSession().getServletContext().getRealPath("/uploadFile/");
        System.out.println(realPath);
        String format = sdf.format(new Date());
        File folder = new File(realPath + format);
        String filePath="";
        if (!folder.isDirectory()) {
            folder.mkdirs();
        }
        //当前文件名
        String oldName = uploadFile.getOriginalFilename();
        //新文件名
        String newName = UUID.randomUUID().toString() +
                oldName.substring(oldName.lastIndexOf("."), oldName.length());
        try {
            //将接收到的文件传输到给定的目标文件。
            uploadFile.transferTo(new File(folder, newName));
            //项目访问文件的路径
            filePath = req.getScheme() + "://" + req.getServerName() + ":" +
                    req.getServerPort() + "/uploadFile/" + format + newName;

        } catch (IOException e) {
            e.printStackTrace();
            return "上传失败! ";
        }
        return filePath;
    }

    /**
     * 上传多个文件到指定路径中
     * @param uploadFiles   uploadPahtFile
     * @param fileSavePath   fileSavePath
     * @param req request
     * @return 返回通过项目访问文件的路径的集合（需要配置资源映射）
     */
    public static List<String> uploadPahtFiles(MultipartFile[] uploadFiles, String fileSavePath, HttpServletRequest req) {
        //所传入文件项目访问路径的集合
        ArrayList<String> filePathlist=new ArrayList();
        String filePath = "";
        for(MultipartFile uploadFile:uploadFiles){
            //如果文件名位空，则不保存
            if ("".equals(uploadFile.getOriginalFilename())){
                continue;
            }
            String format = sdf.format(new Date());
            File folder = new File(fileSavePath + format);
            if (!folder.isDirectory()) {
                folder.mkdirs();
            }
            String oldName = uploadFile.getOriginalFilename();
            String newName = UUID.randomUUID().toString() +
                    oldName.substring(oldName.lastIndexOf("."), oldName.length());
            try {
                uploadFile.transferTo(new File(folder, newName));
                filePath = req.getScheme() + "://" + req.getServerName() + ":" +
                        req.getServerPort() + "/uploadFile/" + format + newName;
            } catch (IOException e) {
                e.printStackTrace();
            }
            //将访问路径放入集合中
            filePathlist.add(filePath);
        }
        return filePathlist;
    }

    /**
     * 上传文件并且返回数据库文件记录
     * @param uploadFile 上传文件
     * @param fileSavePath 物理路径
     * @param req   request
     * @return 返回文件记录对象
     */
    public static UploadFile uploadPahtFileAndUploadFile(MultipartFile uploadFile, String fileSavePath, HttpServletRequest req){
        if ("".equals(uploadFile.getOriginalFilename())){
            return null;
        }
        UploadFile fileData = new UploadFile();
        //项目访问的路径
        String filePath = "";
        String format = sdf.format(new Date());
        //固定物理路径
        File folder = new File(fileSavePath + format);
        //如果文件夹不存在则创建
        if (!folder.isDirectory()) {
            folder.mkdirs();//创建文件夹
        }
        //上传的文件名
        String oldName = uploadFile.getOriginalFilename();
        //新的文件名
        String uuid=UUID.randomUUID().toString();
        String newName = uuid +
                oldName.substring(oldName.lastIndexOf("."), oldName.length());
        try {
            //将uploadFile存到一个路径为：folder，名字为：newName的文件，
            uploadFile.transferTo(new File(folder, newName));
            //去掉盘符的相对路径
            String path=fileSavePath.split(":")[1];
            //获取项目访问的路径
            filePath = req.getScheme() + "://" + req.getServerName() + ":" +
                    req.getServerPort() + path + format + newName;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        //记录到数据库中
        fileData.setUuid(uuid);
        fileData.setNewName(newName);
        fileData.setOldName(oldName);
        fileData.setPath(filePath);
        fileData.setFilePath(fileSavePath+format+newName);
        fileData.setCreateTiem(new Date());
        return fileData;
    }


}

//配置资源映射的配置类
